package dto

/*
通过深入分析前端源代码，我发现主要问题出在 utils.ts 第54行的 filterChildrenTree 函数：
typescriptfunction filterChildrenTree(data: RouteComponent[]) {
  const newTree = cloneDeep(data).filter((v: any) => v?.children?.length !== 0);
  // 这行代码会过滤掉所有 children.length === 0 的项目
}
关键问题：

你的数据结构中，每个子路由都包含了 "children": []（空数组）
filterChildrenTree 函数会过滤掉所有 children.length === 0 的路由
因此你的所有子菜单（如 SystemUser、SystemRole 等）都被过滤掉了
只剩下父级路由 /system，但没有子菜单，所以菜单看起来是空的

而官方示例能工作的原因：
官方示例中的子路由根本没有 children 字段，所以不会被这个过滤函数影响。
解决方案很简单：
只需要移除所有叶子节点（最终页面路由）的 children 字段即可。保留父级路由的 children 数组，但移除子路由的空 children 数组。
这就解释了为什么相同的权限配置下，官方示例能显示而你的不能显示的根本原因。

*/

type MenuDto struct {
	ID       uint       `json:"-"`                  // 菜单ID
	Path     string     `json:"path"`               // 路由路径
	Name     string     `json:"name"`               // 路由名称
	Meta     Meta       `json:"meta"`               // 菜单元信息
	Children []*MenuDto `json:"children,omitempty"` // 子菜单，使用 omitempty 标签  //这里大坑，必须设置omitempty，否则会导致前端菜单无法渲染,
}

/*
 关于Meta中Roles字段的注释：
 Roles 字段用于页面级别的权限设置，通常是一个字符串数组，包含可以访问该页面的角色名称。
 例如，如果一个页面只允许管理员访问，可以设置为 Roles: ["admin"]。
如果不需要角色权限控制，可以将 Roles 字段留空或删除。
PureAdmin前端逻辑:
isOneOfArray 函数通常的实现逻辑是：
javascriptfunction isOneOfArray(targetArray, sourceArray) {
  // 如果 targetArray 为 null、undefined 或空数组，通常返回 true
  // 这表示"无权限限制"，允许所有用户访问
  if (!targetArray || targetArray.length === 0) {
    return true;
  }

  // 检查 sourceArray 中是否包含 targetArray 中的任意一个元素
  return targetArray.some(role => sourceArray.includes(role));
}
null 被视为无权限限制：当 v.meta?.roles 为 null 时，isOneOfArray(null, currentRoles) 返回 true
设计理念：在RBAC系统中，roles 为空通常表示"对所有用户开放"，而不是"禁止所有用户访问"
默认行为：这是一种宽松的权限策略，避免因配置错误导致菜单完全不可访问
*/

type Meta struct {
	Title    string `json:"title"`    // 菜单标题
	Icon     string `json:"icon"`     // 菜单图标
	ShowLink bool   `json:"showLink"` // 是否显示
	//Roles      []string `json:"roles"`      // 页面级别权限设置 //可以不要
	ExtraIcon  string   `json:"extraIcon"`  // 菜单名称右侧的额外图标
	ShowParent bool     `json:"showParent"` // 是否显示父级
	Auths      []string `json:"auths"`      // 按钮级别权限设置
	Rank       int      `json:"rank"`       // 菜单排序 //如果给前端传了rank字段，后端就必须要对rank字段赋值，并且不能一样
}

type CreateMenuDto struct {
	Name       string `json:"name"`       // 菜单名称
	Title      string `json:"title"`      // 菜单标题
	Type       int8   `json:"menuType"`   // 菜单类型: 0菜单1按钮2权限
	Path       string `json:"path"`       // 路由路径
	Icon       string `json:"icon"`       // 菜单图标
	Rank       int    `json:"rank"`       // 菜单排序 前端排序字段是 rank
	ShowLink   bool   `json:"showLink"`   // 是否隐藏
	ShowParent bool   `json:"showParent"` // 是否显示父级
	ParentID   uint   `json:"parentId"`   // 父级ID
	Auths      string `json:"auths"`      // 权限标识
	Method     string `json:"method"`     // API请求方法
}
type UpdateMenuDto struct {
	ID         uint   `json:"ID"`         // 菜单ID
	Name       string `json:"name"`       // 菜单名称
	Title      string `json:"title"`      // 菜单标题
	Type       int8   `json:"menuType"`   // 菜单类型: 0
	Path       string `json:"path"`       // 路由路径
	Method     string `json:"method"`     // API请求方法
	Icon       string `json:"icon"`       // 菜单图标
	Rank       int    `json:"rank"`       // 菜单排序 前端排序字段是 rank
	ShowLink   bool   `json:"showLink"`   // 是否隐藏
	ShowParent bool   `json:"showParent"` // 是否显示父级
	ParentID   uint   `json:"parentId"`   // 父级ID
	Auths      string `json:"auths"`      // 权限标识
}
type DelMenuByIDDto struct {
	ID uint `json:"ID"` // 菜单ID
}
